/**
* @fileOverview 请求接口公共处理
* @author wind-lc
* @version 1.0
*/

import axios from 'axios'
import router from '@/router'
import { Message } from 'ant-design-vue'
import Qs from 'qs'
// import store from '../store/index'
import {
  list
} from '@/utils/url-white-list'
import { getToken } from '@/utils/auth'
import {
  codeHeaders,
  encryptBody
} from '@/utils/sm'

// 环境切换
axios.defaults.baseURL = process.env.VUE_APP_BASE_API

// 设置请求超时时间
axios.defaults.timeout = 60000
// 设置请求头
axios.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8'
// 开启携带cookie
axios.defaults.withCredentials = true
// 请求拦截器
axios.interceptors.request.use(
  config => {
    // 如果没有设置Content-Type，默认application/json
    if (!config.headers['Content-Type']) {
      config.headers['Content-Type'] = 'application/json'
    }
    // 方法做防重返和防篡改
    if (process.env.VUE_APP_ENCRYPTION === '1') {
      config = codeHeaders(config)
      config = encryptBody(config)
    }
    // 不需要token的接口
    for (const i of list) {
      if (config.url.indexOf(i) !== -1) {
        return config
      }
    }
    // 每次发送请求之前判断vuex中是否存在token
    // 如果存在，则统一在http请求的header都加上token
    config.headers.Authorization = 'Bearer ' + JSON.parse(getToken())
    return config
  },
  error => {
    return Promise.error(error)
  }
)
// 响应拦截
axios.interceptors.response.use(
  response => {
    if (response.data.code && (response.data.code !== '0') && response.data.msg) {
      Message.error(response.data.msg)
    }
    return Promise.resolve(response)
  },
  error => {
    // // 状态码200成功
    // if (response.status === 200) {
    //   switch (response.data.status) {
    //     case 401:
    //       // 返回 401 清除token信息并跳转到登录页面
    //       store.state.user.token = null
    //       store.state.user.info = null
    //       store.state.user.roles = null
    //       localStorage.removeItem('9ewe0rd87w')
    //       router.push({ name: 'signIn' })
    //       break
    //     case 403:
    //       // 返回 403 没有权限访问该页面跳转403
    //       router.push({ name: '403' })
    //       break
    //   }
    //   return Promise.resolve(response)
    // } else {
    //   return Promise.reject(response)
    // }
    console.log(error, error.response)
    switch (error.response.data.status) {
      case '401':
        router.push({ name: 'signIn' })
        break
      case '403':
        router.push({ name: '403' })
        break
    }
    if (error.response.data.message === '原始口令校验失败。') {
      Message.error('旧密码输入错误')
    } else if (error.response.data.message === '原始口令与新口令不能一样。') {
      Message.error('旧密码和新密码不能重复')
    } else {
      if (!error.response.data) {
        Message.error('This request has no response data available')
      } else if (error.response.data.path && error.response.data.message) {
        Message.error(error.response.data.path + error.response.data.message)
      }
      return Promise.reject(error.response.data)
    }
  }
)

/**
 * get请求
 * @param {String} url 请求地址
 * @param {String} params 请求携带参数
 * @return {Object} Promise 返回Promise对象
 */
const get = function (url, params) {
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params: params
      })
      .then(res => {
        resolve(res.data)
      })
      .catch(error => {
        reject(error)
      })
  })
}
/**
 * post请求
 * @param {String} url 请求地址
 * @param {Object} params 请求携带参数
 * @return {Object} Promise 返回Promise对象
 */
const post = function (url, params, headers, baseURL) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, params, { headers: headers, baseURL: baseURL })
      .then(res => {
        resolve(res.data)
      })
      .catch(error => {
        reject(error)
      })
  })
}
/**
 * post请求
 * @param {String} url 请求地址
 * @param {Object} params 请求携带参数
 * @return {Object} Promise 返回Promise对象
 */
const postQs = function (url, params) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, Qs.stringify(params), { headers: { 'content-type': 'application/x-www-form-urlencoded' } })
      .then(res => {
        resolve(res.data)
      })
      .catch(error => {
        reject(error)
      })
  })
}
/**
 * delete请求
 * @param {String} url 请求地址
 * @param {Object} params 请求携带参数
 * @return {Object} Promise 返回Promise对象
 */
const del = function (url, params) {
  return new Promise((resolve, reject) => {
    axios
      .delete(url, { data: params })
      .then(res => {
        resolve(res.data)
      })
      .catch(error => {
        reject(error)
      })
  })
}
/**
 * put请求
 * @param {String} url 请求地址
 * @param {Object} params 请求携带参数
 * @return {Object} Promise 返回Promise对象
 */
const put = function (url, params) {
  return new Promise((resolve, reject) => {
    axios
      .put(url, params)
      .then(res => {
        resolve(res.data)
      })
      .catch(error => {
        reject(error)
      })
  })
}
export { get, post, postQs, del, put }
